package com.kamistoat.base;

import com.google.common.base.*;

/**
 *
 */
public class Optional_Demo {

    public static void main(String[] args) {
        try {
            // 这里的student可以来自任何地方，最常见: 远程接口发送来的或者从数据库中查出来的
            Student student_1 = null;
            // 直接用Optional进行引用，用of如果为Null直接抛出异常
            Optional<Student> temp = Optional.of(student_1);
        } catch (NullPointerException nullPointerException) {
            // 可以用catch捕获可能抛出的空指针异常
            nullPointerException.printStackTrace();
            System.out.println("接收到不允许的Null值");
        } finally {
            Student student_2 = new Student(3, "王五");
            System.out.println(student_2.toString());
            Optional<Student> studentOptional = Optional.of(student_2);
            // 使用 Optional时必须显式从Optional中获取引用值，然后才能进行修改
            studentOptional.get().setName("张三");
            System.out.println(student_2.toString());
            // 注意，直接修改student_2，Optional中引用的内容也会改变
            // 但是!!!! 如果直接用 student_2 = null， 是无法将Optional中也改成null的
        }
    }
}

class Student {
    int num;
    String name;

    public Student() {
    }

    public Student(int num, String name) {
        this.num = num;
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "姓名: " + this.name + ", 学号: " + this.num;
    }
}
